package no.hib.dat102;
import java.util.Iterator;

import no.hib.dat102.adt.KoADT;

public class SirkulaerTabellKo<T> implements KoADT<T> {

	private final static int STDK = 100;
	private int front, bak, antall;
	private T[] ko;

	/**
	 * Oppretter en tom ko med standard kapasitet
	 */
	public SirkulaerTabellKo() {
		front = bak = antall = 0;
		
		// Obskur feil!
		ko = (T[]) (new Object[STDK]);
	}

	/**
	 * Oppretter en tom ko med den angitte kapasiteten
	 * 
	 * @param Storrelsen
	 *            av den sirkulaere tabell ko
	 */
	public SirkulaerTabellKo(int startKap) {
		antall = bak = front = 0;
		ko = ((T[]) (new Object[startKap]));
	}

	/**
	 * Oppretter en ny tabell og dobler kapasiteten paa den gamle.
	 */
	private void UtvidKap() {
		T[] storre = (T[]) (new Object[ko.length * 2]);

		for (int sok = 0; sok < antall; sok++) {
			storre[sok] = ko[front];
			front = (front + 1) % ko.length;
		}

		front = 0;
		bak = antall;
		ko = storre;
	}

	/**
	 * Returnerer en referanse til elementet i front i koen
	 * 
	 * @return forste elementet i koen
	 * @throws EmptyCollectionException
	 *             hvis koen er tom
	 */
	public T forste() throws EmptyCollectionException {
		if (erTom()){
	         throw new EmptyCollectionException ("Ko"); 
		}
	      return ko[front];
	}

	/**
	 * Legger til et element i bak koen, og utvider ved behov.
	 */
	public void innKo(T element) {
		if (storrelse() == ko.length) {
			UtvidKap();
		}
		ko[bak] = element;
		bak = (bak + 1) % ko.length;
		antall++;

	}

	/**
	 * Fjerner elementet i fronten av koen. 
	 * Kaster EmptyCollectionException dersom koen er tom  
	 * 
	 */
	public T utKo() throws EmptyCollectionException {
		
		if (erTom()) throw new EmptyCollectionException("ko");
		
		T resultat = ko[front];
			ko[front] = null;
			front = (front + 1) % ko.length;
			antall--;

		
		return resultat;
	}

	/**
	 * Returnerer EmptyCollectionException hvis denne koen er tom, ellers usann.
	 * 
	 * @return true hvis denne koen er tom
	 */

	public boolean erTom() {
		if (antall == 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Returnerer antall elementer i denne koen.
	 */
	public int storrelse() {
		return antall;
	}
	
	
	
//	public String toString() {
//		String resultat = "";
//		int sok = 0;
//
//		while (sok < antall) {
//
//			if (ko[sok] != null) {
//				resultat += ko[sok].toString() + "\n";
//			}
//			sok++;
//		}
//		return resultat;
//	}
}
